#ifndef _RFID_APP_H_
#define _RFID_APP_H_

#include <stdint.h>
#include <stdbool.h>
#include "rfid_board.h"

#if _RFID_FUNCTION_ENABLE_
// 私密起始操作扇区
#define RFID_PRIVATE_START_SECTOR                          (14ul)

/* 定义卡片目录 */
// 主目录
#define CPU_CARD_MAIN_DIRECTORY                             (0x3F00)
// 用户目录
#define CPU_BINARY_FILE_DIRECTORY                           (0x0003)
/* 定义目录名称 */
// 用户卡目录 - 杨格
#define YG_CPU_USER_DIRECTOR_NAME                           "YGS_USER_PROFILE"
// 用户卡目录 - 华住
#define HZ_CPU_USER_DIRECTOR_NAME                           "H_WORLD_GROUP_01"

// 芯片复位等待稳定时间
#define RFID_CHIP_REBOOT_WAIT_READY_TIME                    (10ul)
// 卡数据操作时间  - 10ms
#define RFID_CARD_DATA_OPERATION_TIME                       (10ul)

// 重复读卡次数
#define RFID_REPEAT_READ_CARD_TIMES                         (3ul)
// 重复读卡间隔时间
#define RFID_REPEAT_READ_CARD_INTERVAL                      (100ul)
// 楼层数组数据长度
// #define FLOOR_ARRAY_DATA_LEN                                (16ul) 放入宏编译

/**
 * @brief 卡片操作步骤
 *
 */
typedef enum
{
  CARD_STEP_START,                    // 启动
  CARD_STEP_ERROR,                    // 错误
  CARD_STEP_SUCCESS,                  // 成功
  CARD_WRITE_DATA_TO_SECTOR,          // 将数据写入到扇区
  CARD_VERIFY_DATA_VALIDITY,          // 验证数据有效性
  CARD_READ_DATA_FROM_SECTOR,         // 从扇区读取数据
  CARD_STEP_VERIFY_USER_KEY_TO_READ,  // 验证密钥以读取
  CARD_STEP_VERIFY_USER_KEY_TO_WRITE, // 验证密钥以写入
} CardExecuteStep_t;

/**
 * @brief 命令执行结果
 *
 */
typedef enum
{
  CARD_EXECUTE_ERROR,         // 执行失败
  CARD_NOT_SUPPORTED,         // 不支持
  CARD_DOES_NOT_EXIST,        // 卡片不存在
  CARD_EXECUTE_SUCCESS,       // 执行完毕
  CARD_EVENT_PROCESSING,      // 事件正在处理
  CARD_COMMUNICATION_FAILURE, // 通讯失败
  CARD_INSUFFCIENT_AUTHORITY, // 权限不足
  CARD_IS_RUNNING, // 正在运行，还有第二步
} RfidExecuteResult_t;

/**
 * @brief 系统状态
 *
 */
typedef struct
{
  uint8_t BusyEn   : 1; // 繁忙标识
  uint8_t Reserved : 7; // 保留
} RfidSystemParameter_t;

/**
 * @brief 扇区参数
 *
 */
typedef struct
{
  uint8_t RWBlockId;                                           // 当前操作块
  uint8_t RWSectorId;                                          // 当前操作扇区
  uint16_t RWDataSize;                                         // 已操作的数据长度
  uint8_t ExecuteStep;                                         // 命令执行步骤
  uint16_t TotalDatLength;                                     // 数据总长度
  uint8_t KeyValueA[RFID_MAX_NUMBER_OF_CODED_TEXT];            // 用户密钥A
  uint8_t KeyValueB[RFID_MAX_NUMBER_OF_CODED_TEXT];            // 用户密钥B
  uint8_t SectorDataBuff[RFID_MAX_LENGTH_OF_OPERATION_DATA];   // 扇区操作数据
  uint8_t CardSerialNumber[RFID_NUMBER_OF_CARD_SERIAL_NUMBER]; // 卡片序列号
} RfidSectorParameter_t;

/**
 * @brief 状态位
 *
 */
typedef struct
{
  RfidSystemParameter_t SystemParameter; // 系统参数
  RfidSectorParameter_t SectorParameter; // 扇区参数
} RfidStatusBit_t;
#endif


/**
 * @brief 机号楼层与权限
 *
 */
typedef struct
{
  uint16_t EleNum;         //机号
  uint8_t ElePermission[FLOOR_ARRAY_DATA_LEN]; // 楼层权限
} RfidHzElePermission_t;

/**
 * @brief  用户类型
 * 
 */
typedef enum{
  NormalUser = 1,
  AdminUser,
  EmergencyUser,
  ClearData,
}UserType_t;

/**
 * @brief HZ卡片用户编码状态
 *
 */
typedef struct
{
  uint8_t FunctionCode; // 功能码
  uint8_t AuthorizationCode[3]; // 授权编码
  uint8_t StartTime[4];         //起始时间
  uint8_t StopTime[4];         //结束时间
  uint8_t Reserve[3];          //保留
  uint8_t UserType;            //用户类型 UserType_t
  RfidHzElePermission_t Ele;           //8个机号
  uint8_t Recv_OverFg;
} RfidHzDateParameter_t;




/**
 * @brief 使能卡片检测功能
 *
 */
extern void RfidEnableCardDecetionFunction(void);

/**
 * @brief 禁用卡片检测功能
 *
 */
extern void RfidDisableCardDecetionFunction(void);

/**
 * @brief 启动 rfid 设备自检
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool RfidStartDeviceSelfTestTask(void);

/**
 * @brief 启动读取卡片数据
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool RfidStartReadCardDataTask(void);

/**
 * @brief 启动卡片数据更新任务
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool RfidStartCardDataUpdateTask(void);

/**
 * @brief 启动本地注册用户
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool RfidStartLocalRegisterUserTask(void);

/**
 * @brief 退出当前任务
 *
 */
extern void RfidExitCurrectTask(void);

/**
 * @brief 初始化相关功能
 *
 */
extern void RfidConfiguration(void);
/**
 * @brief HZ卡处理函数
 *
 */
extern bool ReadHZCardDateHandle(uint8_t Block, uint8_t *iPdate,uint16_t Len);
/**
 * @brief 设置紧急状态
 *
 */
void Set_EmergenFg(bool iPdate);
/**
 * @brief 获取紧急状态
 *
 */
void Set_EmergenFg(bool iPdate);
/**
 * @brief 获取鉴权状态
 *
 */
extern uint8_t GetIdentifyType(void);
// extern uint8_t IdentifyType;
#endif
